package com.example.rabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: ft
 * @Date:2025/8/26
 * @Description: 相关单据：
 */
@Configuration
public class RabbitFanoutConfig {
//    // 正常队列名称
//    public static final String NORMAL_QUEUE = "normal.queue";
//    // 死信队列名称
//    public static final String DLQ_QUEUE = "dlq.queue";
//    // 正常交换机名称
//    public static final String NORMAL_EXCHANGE = "normal.exchange";
//    // 死信交换机名称
//    public static final String DLX_EXCHANGE = "dlx.exchange";
//    // 路由键
//    public static final String ROUTING_KEY = "normal.key";

//    @Bean
//    public DirectExchange normalExchange() {
//        return new DirectExchange(NORMAL_EXCHANGE);
//    }
//
//    @Bean
//    public DirectExchange dlxExchange() {
//        return new DirectExchange(DLX_EXCHANGE);
//    }
//
//    @Bean
//    public Queue normalQueue() {
//        Map<String, Object> args = new HashMap<>();
//        // 设置死信交换机
//        args.put("x-dead-letter-exchange", DLX_EXCHANGE);
//        // 设置死信路由键
//        args.put("x-dead-letter-routing-key", DLQ_QUEUE);
//        // 设置消息过期时间（单位：毫秒）
//        args.put("x-message-ttl", 10000); // 10秒
//
//        return QueueBuilder.durable(NORMAL_QUEUE)
//                .withArguments(args)
//                .build();
//    }
//
//    @Bean
//    public Queue dlqQueue() {
//        return  QueueBuilder.durable(DLQ_QUEUE).build();
//    }
//
//    @Bean
//    public Binding bindingNormalToExchange() {
//        return BindingBuilder.bind(normalQueue()).to(normalExchange())
//                .with(ROUTING_KEY);
//    }
//
//    @Bean
//    public Binding bindingDLQToExchange() {
//        return BindingBuilder.bind(dlqQueue()).to(dlxExchange())
//                .with(DLQ_QUEUE);
//    }


    @Bean
    public Queue orderQueue() {
        //durable:是否持久化,默认是false,持久化队列会被存盘,服务器重启后队列还在
        //exclusive:默认也是false,是否排他.排他队列只能被创建者使用,当连接关闭后队列自动删除,如果将此参数设置true可用于临时队列的创建
        //autoDelete:是否自动删除,默认也是false,当没有生产者或者消费者使用此队列,该队列会自动删除,如果将此参数设置true就可以实现这个功能
        Map<String,Object> args = new HashMap<>();
        args.put("x-message-ttl",2000); //设置存活时间,毫秒单位
        args.put("x-max-length",16);//设置队列最大长度,先进为消费的消息会进入死信队列
        args.put("x-dead-letter-exchange","my.test.order.pay.dead.exchange");//设置死信交换机
        args.put("x-dead-letter-routing-key","my.test.order.pay.dead.route");//设置死信路由键
        return QueueBuilder.durable("my.test.order.pay.queue").withArguments(args).build();
    }

    @Bean
    public DirectExchange orderExchange() {
        return new DirectExchange("my.test.order.normal.exchange");
    }

    @Bean
    public Binding orderBinding() {
        return BindingBuilder.bind(orderQueue()).to(orderExchange()).with("my.test.order.normal.route");
//        return new Binding("order-pay-queue", Binding.DestinationType.QUEUE, "order-pay-exchange", "", null);
    }

    @Bean
    public Queue deadLetterQueue() {
        return QueueBuilder.durable("my.test.order.pay.dead.queue").build();
    }

    @Bean
    public DirectExchange deadLetterExchange() {
        return new DirectExchange("my.test.order.pay.dead.exchange");
    }

    @Bean
    public Binding deadLetterBinding() {
        return BindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange()).with("my.test.order.pay.dead.route");

//        return new Binding("dead-order-pay-queue", Binding.DestinationType.QUEUE, "dead-order-pay-exchange", "order-pay-dead", null);
    }

}